﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Box.Entities;
using Box.Repository;
using Microsoft.Practices.Unity;

namespace Box.BL
{
  public  class VentaBL:IVentaBL
    {

      [Dependency]
      public IVentaRepository ventaRepo { get; set; }
      [Dependency]
      public IProductoRepository productoRepo { get; set; }
      [Dependency]
      public IDetalleVentaRepository detVentaRepo { get; set; }
        public List<Venta> GetAllFromVentas()
        {
            return ventaRepo.GetAllFromVenta();
        }


        public Venta GetFromVentasById(int id)
        {
            return ventaRepo.GetFromVentaById(id);
        }

        public void AddVenta(Venta Venta)
        {                        
            ventaRepo.AddVenta(Venta);
        }

        public void UpdateVenta(Venta Venta)
        {
           ventaRepo.UpdateVenta(Venta);
        }

        public void RemoveVenta(int id)
        {
            ventaRepo.RemoveVenta(id);
        }

        public bool ExisteVenta(int id)
        {
            return ventaRepo.ExisteVenta(id);
        }


        public List<Venta> GetFromVentasByRangoFechas(DateTime fechaI, DateTime fechaF)
        {
            return ventaRepo.GetFromVentasByRangoFechas(fechaI, fechaF);
        }


        public List<Venta> GetFromVentasByAnio(int anio)
        {
            return ventaRepo.GetFromVentasByAnio(anio);
        }


        public List<decimal> ListVent(int anio)
        {
            return ventaRepo.ListVent(anio);
        }


        public List<Venta> GetFRomVentasAnuladadByCriterio(string criterio)
        {
            return ventaRepo.GetFRomVentasAnuladadByCriterio(criterio);
        }


        public string GetNetxtNroBoleta()
        {
            return ventaRepo.GetNetxtNroBoleta();
        }
        #region Stock

      private void ValidarStock(Venta venta)
      {
          foreach (var item in venta.DetalleVenta)
          {
              var producto = productoRepo.GetFromProductoById(item.IdProducto);
              var cantActualDetalle = detVentaRepo.GetFromProductoByDetalleVentaId(item.IdProducto, venta.Id);

              if (cantActualDetalle == null)
              {
                  if (item.Cantidad > producto.Stock)
                  {
                      throw new Exception(string.Format("No hay Stock suficiente para el producto {0}," +
                                        " solo quedan {1} Und.", producto.NombreProducto, producto.Stock));
                  }
              }
              if (cantActualDetalle != null)
              {
                  var stockActual = producto.Stock + cantActualDetalle.Cantidad;
                  if (item.Cantidad > stockActual)
                  {
                      throw new Exception(string.Format("La maxima cantidad a elegir del producto {0}," +
                                        " es {1} Und.", producto.NombreProducto, stockActual));
                  }
              }
          }
      }

      #endregion


      public IEnumerable<Venta> GetFromVentasByCriterio(string criterio, bool? anulados, bool? todos)
      {
          return ventaRepo.GetFromVentaByCriterio(criterio, anulados, todos);
      }
    }
}
